package _21_多线程juc._countdownlatch;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用 线程池 替代 CountDownLatchTest01 里面的线程创建方式
 */
public class CountDownLatchTest07 {

    public static void main(String[] args) throws InterruptedException {
        // 定义子任务的个数
        int count = 3;
        // 主任务 latch
        CountDownLatch latch = new CountDownLatch(count);
        // 主任务开始
        System.out.println("主任务开始...");


        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        Random random = new Random();
        // 三个子任务执行，执行完通知 主任务
        for (int i = 0; i < count; i++) {
            threadPool.execute(() -> {
                // 子线程执行业务，使用随机数模拟执行时间长短
                try {
                    int num = random.nextInt(8);
                    Thread.sleep(num * 1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                // 子任务执行完毕
                System.out.println( "  " + Thread.currentThread().getName() + " 子线程执行任务完毕");
                // 执行完毕通知主任务
                latch.countDown();
            });
        }

        // 主任务等待子任务全部执行完毕
        latch.await();

        // 主任务继续 业务
        System.out.println("全部子任务执行完毕，主任务继续...");
        Thread.sleep(3000);

        // 主任务执行完毕
        System.out.println("主任务执行完毕");

        threadPool.shutdown();
    }

}
